<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            1.什么是json
                是一种轻量级的数据交换格式，易于人阅读和编写，可以在多种语言之间进行数据交换 是一中格式,而不是数据

            2.json作用
                json主要是用来传输数据中的字符串，json的对象是JSON 键/值对，数组和其他对象
                1.前后端交互  主流数据    2.深拷贝

                简单数据类型    number string boolen undefined null bigInt symbol
                复杂数据类型    引用数据类型 object array function RegExp

            3.json格式
                1.JSON中没有undefined
                2.JSON中的字符串必须使用双引号
                3.JSON中是不能用注释的
            
            var str = "{'name':'张三','age':20,'height':'178cm'}";
            var str = '{"name":"张三","age":20,"height":"178cm"}';
            var str = "<xml version=1.0 encoding=utf-8>"+
                "<books>"+
                    "<nodejs>"+
                        "<bookname>"+
                            "nodejs从入门到精通"+
                            "</bookname>"+
                        "<price>"+
                            "$13"
                        "</price>"+
                    "</nodejs>"
                "</books>"
                
                
                       
        */


        /*4.json使用
            1.js里面的json转换
            JSON.stringify 把js里面的对象或者数组转成json字符串
            JSON.parse  可以把json字符串转成对象或者数组
        */

        // var obj1 = {
        //     name: "zhangsan",
        //     age: 20,
        //     fn: function () {
        //         console.log(66);
        //     },
        //     a: undefined
        // }
        // var obj2 = JSON.parse(JSON.stringify(obj1));
        // console.log(obj1);
        // console.log(obj2);
        //json 深拷贝有缺陷 ，会忽略掉 函数 undefined 及 map 和set

        //使用JSON实现深拷贝
        //老对象
        let obj = {
            name: 'zhangsan',
            pos : ['北京','武汉','上海','西安'],
            founder : {
                name: '飞哥',
                age: 33
            }
        }
        //1.把对象转化为JSON字符串  
        let str = JSON.stringify(obj)
        console.log(obj);
        console.log(str);

        //修改新对象的属性
        newObj.pos[2] = '成都'

        //2.把JSON字符串转化为对象
        const newObj = JSON.parse(str)

        console.log(str);
        console.log(newObj);
        console.log(obj);
        


    //object.create
    // 创建对象
    // var obj = {}
    // var obj2 = new Object();
    // var obj3 = new P();
    // Object.create()

    // 老对象
    var car = {
        name : '汽车',
        run : function(){
            console.log('可以兜风')
        }
    }

    // 新对象：以老对象car为原型，创建出的新对象
    var aodi = Object.create(car,{
        // 书写新对象的特性
        // 新属性
        brand : {
            value : '奥迪',
            writable : true,  //属性是否可以进行修改，默认值是false
            configurable:true,  //属性是否可以进行删除，默认值是false
            enumerable : true //属性是否可以进行枚举，默认值是false
        },
        price : {
            value : '50w',
            writable : true,
            enumerable : true
        }
    })

    // console.log(car)

    // 修改对象的属性
    // aodi.brand = 'aodi';
    // aodi.price = '40w';

    // 删除对象的属性
    // delete aodi.brand;

    // 枚举对象的属性 for in
    for(var i in aodi){
        console.log(i)
    }

    console.log(aodi)
    // console.log(aodi.name)


    //boject.create属性配置
    // 创建对象
    // var obj = {}
    // var obj2 = new Object();
    // var obj3 = new P();
    // Object.create()

    // 老对象
    var car = {
        name : '汽车',
        run : function(){
            console.log('可以兜风')
        }
    }

    // 新对象：以老对象car为原型，创建出的新对象
    var aodi = Object.create(car,{
        // 书写新对象的特性
        // 静态的属性 新属性
        brand : {
            value : '奥迪',
            writable : true,  //属性是否可以进行修改，默认值是false
            configurable:true,  //属性是否可以进行删除，默认值是false
            enumerable : true //属性是否可以进行枚举，默认值是false
        },
        // 动态的属性 新属性
        price : {
            //get  set : 动态获取属性 动态设置属性
            // 动态获取属性
            get : function(){
                return this.m;
            },
            // 动态设置属性
            set : function(v){
                this.m = v;
            }
        }
    })

    
    // 修改对象的属性
    aodi.price = '20w';

    console.log(aodi)

    console.log(aodi.price)
    
    
    // var a = item => item;

    // var a = function(item){
    //     return item;
    // }

    // var obj = {
    //     name:name,
    //     age:age
    // }

    //Object.defineProperties
    // 给对象添加属性
    // var obj = {
    //     name:'xiaoA'
    // }
    // obj.name = 'ssss'
    // obj['age'] = 18;
    // Object.defineProperties()

    // 准备一个对象
    var car = {
        name : '汽车',
        run : function(){
            console.log('兜风')
        }
    }

    // 给car添加新属性
    Object.defineProperties(car,{
        // 新属性
        brand : {
            value : '奔驰',
            configurable : true,//属性是否可以删除
            writable : true, //属性是否可以修改
            enumerable : true // 属性是否可以枚举
        },
        price : {
            value : '30w',
            enumerable : true 
        }
    })

    // 删除对象的属性
    // delete car.brand;
    // delete car.name;

    // 修改对象的属性
    // car.brand = '宝马'
    // car.name = 'carrrrr'

    // 枚举对象的属性
    for(var i in car){
        console.log(i)
    }

    console.log(car)
    
    
    //创建对象4种方式
    //1.字面量 2.内置构造函数 3.工厂模式 4.自定义构造函数

    // 1.字面量
    var obj = {
        name: 'zhangsan'
    }

    // 2.内置构造函数 
    var obj = new Obiject();
    obj.name = 'zhangsan'

    // 3.工厂模式
    function Factory(name,age) {
        var obj = {};
        obj.name = name;
        obj.age = age;
        return obj;
    }
    var obj = Factory('zhangsan', '20')

    //4.自定义构造函数
    function Person(name,age) {
        this.name = name;
        this.age = age;
        return {
            name:''
        }
    }
    Person.prototype.fn = function(){
        console.log("fn...");
    }
    </script>
</body>

</html>